#ifndef EMS_SERVICE_TRACKER_STORAGE_CHARGE_PRICE_TRACKER_H
#define EMS_SERVICE_TRACKER_STORAGE_CHARGE_PRICE_TRACKER_H

#include <cstdint>
#include <mutex>
#include <string>

namespace ems {
namespace service {
namespace tracker {

// 日夜时段定义
struct DayNightPeriod {
    int dayStartHour{6};    // 日间开始小时（含），默认 06:00
    int dayEndHour{18};     // 日间结束小时（不含），默认 18:00
};

// 分时充电统计
struct ChargePriceStats {
    double dayChargeEnergy{0.0};     // 日间累计充电电量（kWh）
    double dayChargeCost{0.0};       // 日间累计充电成本（元）
    double nightChargeEnergy{0.0};   // 夜间累计充电电量（kWh）
    double nightChargeCost{0.0};     // 夜间累计充电成本（元）
    
    double getDayAveragePrice() const {
        return dayChargeEnergy > 1e-6 ? dayChargeCost / dayChargeEnergy : 0.0;
    }
    
    double getNightAveragePrice() const {
        return nightChargeEnergy > 1e-6 ? nightChargeCost / nightChargeEnergy : 0.0;
    }
    
    double getTotalAveragePrice() const {
        const double totalEnergy = dayChargeEnergy + nightChargeEnergy;
        const double totalCost = dayChargeCost + nightChargeCost;
        return totalEnergy > 1e-6 ? totalCost / totalEnergy : 0.0;
    }
};

// SOC 增量监控与分时成本跟踪器
class StorageChargePriceTracker {
public:
    StorageChargePriceTracker();
    ~StorageChargePriceTracker() = default;
    
    // 配置参数
    void setBatteryCapacity(double capacityKwh);
    void setDayNightPeriod(int dayStartHour, int dayEndHour);
    void setMaxSocDelta(double maxDelta);  // 设置最大允许 SOC 增量（默认 5.0%）
    void setStorageCostRate(double costRate);  // 设置储能损耗成本系数（默认 0.0，单位：元/kWh）
    
    // 核心采样接口
    // soc: 当前 SOC 百分比（0-100）
    // timestamp: 采样时间戳（Unix 秒）
    // pvPrice: 光伏电价（元/kWh），用于日间成本
    // gridPrice: 市电电价（元/kWh），用于夜间成本
    void onSample(double soc, std::int64_t timestamp, double pvPrice, double gridPrice);
    
    // 查询统计结果
    ChargePriceStats getStats() const;
    double getDayAveragePrice() const;
    double getNightAveragePrice() const;
    double getTotalAveragePrice() const;
    
    // 重置统计（可用于每日零点或 SOC 校准）
    void reset();
    
    // 获取上一次有效 SOC 和时间戳（用于调试）
    double getLastSoc() const;
    std::int64_t getLastTimestamp() const;

private:
    // 判断时间戳是否在日间时段
    bool isDaytime(std::int64_t timestamp) const;
    
    // 验证 SOC 增量是否有效（避免跳变）
    bool isValidDelta(double deltaSoc) const;
    
    mutable std::mutex mutex_;
    
    // 配置参数
    double batteryCapacityKwh_{100.0};  // 默认电池容量 100kWh
    DayNightPeriod period_;
    double maxSocDelta_{5.0};           // 最大允许单次 SOC 增量（百分比）
    double storageCostRate_{0.0};       // 储能损耗成本系数（元/kWh），用于日间光伏充电成本
    
    // 运行状态
    double lastSoc_{-1.0};              // 上一次采样的 SOC（-1 表示未初始化）
    std::int64_t lastTimestamp_{0};     // 上一次采样时间戳
    
    // 统计累计
    ChargePriceStats stats_;
};

}  // namespace tracker
}  // namespace service
}  // namespace ems

#endif  // EMS_SERVICE_TRACKER_STORAGE_CHARGE_PRICE_TRACKER_H
